package com.core.cloudbusiness.system.device.service;

import com.core.cloundbusinessapi.system.device.dto.UserDeviceDTO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * @author =====Lqj=====
 * @className UserDeviceService
 * @description 用户设备管理服务接口
 * @create 2024/12/16 15:30
 **/
public interface UserDeviceService {

    /**
     * 获取用户的所有设备
     * @param userId 用户ID
     * @return 设备列表
     */
    List<UserDeviceDTO> getUserDevices(Long userId);

    /**
     * 获取用户的在线设备
     * @param userId 用户ID
     * @return 在线设备列表
     */
    List<UserDeviceDTO> getOnlineDevices(Long userId);

    /**
     * 根据token获取设备信息
     * @param token 用户token
     * @return 设备信息
     */
    UserDeviceDTO getDeviceByToken(String token);

    /**
     * 踢出指定设备
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @return 是否成功
     */
    boolean kickOutDevice(Long userId, String deviceId);

    /**
     * 踢出除当前设备外的所有设备
     * @param userId 用户ID
     * @param currentToken 当前设备token
     * @return 踢出的设备数量
     */
    int kickOutOtherDevices(Long userId, String currentToken);

    /**
     * 更新设备活跃时间
     * @param token 设备token
     */
    void updateDeviceActiveTime(String token);

    /**
     * 设备重命名
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @param newName 新名称
     * @return 是否成功
     */
    boolean renameDevice(Long userId, String deviceId, String newName);

    /**
     * 检查设备是否可信
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @return true-可信，false-不可信
     */
    boolean isDeviceTrusted(Long userId, String deviceId);

    /**
     * 设置设备为可信
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @return 是否成功
     */
    boolean trustDevice(Long userId, String deviceId);

    /**
     * 取消设备可信状态
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @return 是否成功
     */
    boolean untrustDevice(Long userId, String deviceId);

    /**
     * 获取设备登录历史
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @param limit 限制数量
     * @return 登录历史
     */
    List<Map<String, Object>> getDeviceLoginHistory(Long userId, String deviceId, int limit);

    /**
     * 清理离线设备
     * @param userId 用户ID
     * @param offlineMinutes 离线分钟数
     * @return 清理数量
     */
    int cleanOfflineDevices(Long userId, int offlineMinutes);

    /**
     * 获取设备统计信息
     * @param userId 用户ID
     * @return 统计信息
     */
    Map<String, Object> getDeviceStatistics(Long userId);

    /**
     * 检测异常设备
     * @param userId 用户ID
     * @return 异常设备列表
     */
    List<UserDeviceDTO> detectAbnormalDevices(Long userId);

    /**
     * 生成设备指纹
     * @param request HTTP请求
     * @return 设备指纹
     */
    String generateDeviceFingerprint(HttpServletRequest request);

    /**
     * 解析用户代理信息
     * @param userAgent 用户代理字符串
     * @return 解析结果Map，包含browser、os等信息
     */
    Map<String, String> parseUserAgent(String userAgent);

    /**
     * 获取设备类型名称
     * @param clientType 客户端类型代码
     * @return 设备类型名称
     */
    String getDeviceTypeName(Integer clientType);

    /**
     * 检查设备登录频率是否异常
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @param timeWindowMinutes 时间窗口（分钟）
     * @param maxAttempts 最大尝试次数
     * @return true-异常，false-正常
     */
    boolean isDeviceLoginFrequencyAbnormal(Long userId, String deviceId, 
                                          int timeWindowMinutes, int maxAttempts);

    /**
     * 记录设备登录尝试
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @param success 是否成功
     * @param ip 登录IP
     */
    void recordDeviceLoginAttempt(Long userId, String deviceId, boolean success, String ip);
}
